/*************************************************
* Title：TinyToolKit
* Author：Opportunity 
* Discribe：定义有限状态机管理器的接口
* CreateTime：2020-04-05 21:28:43
* Version：1.0
* Modify Recoder：
*************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace TinyToolKit.FSM
{
    public interface IFsmManager
    {
        /// <summary>
        /// 获取有限状态机的数量
        /// </summary>
        /// <value>返回有限状态机的数量</value>
        int FsmCount { get; }

        /// <summary>
        /// 创建有限状态机
        /// </summary>
        /// <returns>返回创建的状态机</returns>
        /// <param name="name">有限状态机的名字</param>
        /// <param name="owner">有限状态机的持有者</param>
        /// <param name="states">有限状态机的状态</param>
        /// <typeparam name="T">有限状态机持有者的类型</typeparam>
        IFsmSystem<T> CreateFsm<T>(string name, T owner, params FsmState<T>[] states) where T : class;

        /// <summary>
        /// Creates the fsm.
        /// </summary>
        /// <returns>The fsm.</returns>
        /// <param name="name">Name.</param>
        /// <param name="owner">Owner.</param>
        /// <param name="states">States.</param>
        /// <typeparam name="T">The 1st type parameter.</typeparam>
        IFsmSystem<T> CreateFsm<T>(string name, T owner, List<FsmState<T>> states) where T : class;

        /// <summary>
        /// 判断是否存在有限状态机
        /// </summary>
        /// <returns><c>true</c>, 有限状态机存在, <c>false</c> 该有限状态机不存在</returns>
        /// <param name="name">查询的有限状态机的名字</param>
        /// <typeparam name="T">该有限状态机持有者的类型</typeparam>
        bool HasFsm<T>(string name) where T : class;

        /// <summary>
        /// 判断是否存在有限状态机
        /// </summary>
        /// <returns><c>true</c>, 有限状态机存在, <c>false</c> 该有限状态机不存在</returns>
        /// <param name="ownerType">该有限状态机持有者的类型</param>
        /// <param name="name">查询的有限状态机的名字</param>
        bool HasFsm(Type ownerType, string name);

        /// <summary>
        /// 获取有限状态机
        /// </summary>
        /// <returns>返回需要的有限状态机</returns>
        /// <param name="name">有限状态机的名字</param>
        /// <typeparam name="T">有限状态机持有的类型</typeparam>
        IFsmSystem<T> GetFsm<T>(string name) where T : class;

        /// <summary>
        /// 获取有限状态机
        /// </summary>
        /// <returns>返回需要的有限状态机</returns>
        /// <param name="ownerType">有限状态机持有的类型</param>
        /// <param name="name">有限状态机的名字</param>
        FsmSystemBase GetFsm(Type ownerType, string name);

        /// <summary>
        /// 获取所有有限状态机
        /// </summary>
        /// <returns>所有的有限状态机</returns>
        FsmSystemBase[] GetAllFsms();

        /// <summary>
        /// 获取所有有限状态机,fsms不能为Null
        /// </summary>
        /// <param name="fsms">存储所有有限状态机的列表</param>
        void GetAllFsms(List<FsmSystemBase> fsms);

        /// <summary>
        /// 销毁有限状态机
        /// </summary>
        /// <returns><c>true</c>, 该有限状态机被销毁, <c>false</c> 未被销毁.</returns>
        /// <param name="fsm">需要被销毁的有限状态机</param>
        bool DestroyFsm(FsmSystemBase fsm);

        /// <summary>
        /// 销毁有限状态机
        /// </summary>
        /// <returns><c>true</c>, 该有限状态机被销毁, <c>false</c> 未被销毁.</returns>
        /// <param name="ownerType">持有者的类型</param>
        /// <param name="name">有限状态机的名字</param>
        bool DestroyFsm(Type ownerType, string name);

        /// <summary>
        /// 销毁有限状态机
        /// </summary>
        /// <returns><c>true</c>, 该有限状态机被销毁, <c>false</c> 未被销毁</returns>
        /// <param name="name">有限状态机的名字</param>
        /// <typeparam name="T">持有者的类型</typeparam>
        bool DestroyFsm<T>(string name) where T : class;

        /// <summary>
        /// 销毁有限状态机
        /// </summary>
        /// <returns><c>true</c>, 该有限状态机被销毁, <c>false</c> 未被销毁</returns>
        /// <param name="fsm">需要被销毁的有限状态机</param>
        /// <typeparam name="T">持有者的类型</typeparam>
        bool DestroyFsm<T>(IFsmSystem<T> fsm) where T : class;
    }
}

